﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using DAL.Abstract;

namespace DAL.Classes
{
    public class PostNewDAL : abstractDAL
    {
        public PostNew getPostNewByID(int id)
        {
            try
            {
                return (from p in Wiki.PostNews where p.idPostNew == id select p).SingleOrDefault();
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public List<PostNew> getAllPostNew()
        {
            try
            {
                return (from p in Wiki.PostNews select p).ToList();
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public List<PostNew> getAllPostNewByUser(Usuario user)
        {
            try
            {
                return (from p in Wiki.PostNews 
                        where p.idUsuario == user.idUsuario 
                        select p).ToList();
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public void deletePostnew(PostNew postNew)
        {
            try
            {
                Wiki.DeleteTagsPostNewByIDPosyNew(postNew.idPostNew);
                //Primeiro apago todos os comentarios da postNew
                List<Comentario> comentariosPostNew = 
                    (from c in Wiki.Comentarios where c.idPostNew == postNew.idPostNew select c).ToList();
                foreach (Comentario comentario in comentariosPostNew)
                {
                    Wiki.Comentarios.DeleteOnSubmit(comentario);
                }


                //Depois apago a postNew
                Wiki.PostNews.DeleteOnSubmit(postNew);
                Wiki.SubmitChanges();
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public void updatePostnew(PostNew postNew, List<Tag> lstTag)
        {
            try
            {
                Wiki.DeleteTagsPostNewByIDPosyNew(postNew.idPostNew);

                Wiki.UpdatePostNew(postNew.idPostNew, postNew.idUsuario, postNew.idImagem, postNew.titulo, postNew.descricao);
                
                foreach (Tag tag in lstTag)
                {
                    //wiki = new wikiDataContext();
                    TagPostNew tagPostNew = new TagPostNew()
                    {
                        idTag = tag.idTag,
                        idPostNew = postNew.idPostNew
                    };
                    Wiki.TagPostNews.InsertOnSubmit(tagPostNew);
                    Wiki.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void updatePostnew(PostNew postNew)
        {
            try
            {
                PostNew postNewOriginal = (from p in Wiki.PostNews where p.idPostNew == postNew.idPostNew select p).FirstOrDefault();

                postNewOriginal = postNew;

                Wiki.SubmitChanges();
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void InsertPostnew(PostNew postNew)
        {
            try
            {
                Wiki.PostNews.InsertOnSubmit(postNew);
                Wiki.SubmitChanges();
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public void InsertPostnew(PostNew postNew, List<Tag> listTags)
        {
            try
            {
                Wiki.PostNews.InsertOnSubmit(postNew);
                Wiki.SubmitChanges();

                foreach (Tag tag in listTags)
                {
                    TagPostNew tagPostNew = new TagPostNew()
                    {
                        idPostNew = postNew.idPostNew,
                        idTag = tag.idTag
                    };
                    Wiki.TagPostNews.InsertOnSubmit(tagPostNew);
                    Wiki.SubmitChanges();
                }
            }
            catch (SqlException)
            {
                throw;
            }
        }

        public List<PostNew> getPostNewByParameters(string conteudo, string user, DateTime data, List<Tag> listTags)
        {
            try
            {
                List<PostNew> listPostNewAux = (from w in Wiki.PostNews
                        where w.titulo.Contains(conteudo) || w.descricao.Contains(conteudo)
                            && w.Usuario.nome.Equals(user) && w.data <= (data)
                        select w).ToList();

                List<int> listIDPostNewTag = new List<int>();

                if (listTags.Count > 0)
                {
                    foreach (Tag tag in listTags)
                    {
                        listIDPostNewTag.Add((from i in Wiki.PostNewTags
                                              where i.idTag == tag.idTag
                                              select i.idPostNew).SingleOrDefault());
                    }
                }

                List<PostNew> listPosNew = new List<PostNew>();

                if (listIDPostNewTag.Count > 0)
                {
                    for (int i = 0; i < listIDPostNewTag.Count; i++)
                    {
                        foreach (PostNew postNew in listPostNewAux)
                        {
                            if (postNew.idPostNew == listIDPostNewTag[i])
                                listPosNew.Add(postNew);
                        }
                    }
                }
                return listPosNew;
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public List<PostNew> GetTopPostNews(int top)
        {
            try
            {
                return (from p in Wiki.PostNews
                        select p).Take(top).ToList();
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        public List<PostNew> getPostNewByParameters(string conteudo)
        {
            try
            {
                return (from w in Wiki.PostNews
                        where w.titulo.Contains(conteudo) || w.descricao.Contains(conteudo)
                        select w).ToList();
            }
            catch (Exception)
            {

                throw;
            }
        }
    }
}
